// 普通生成函数
// 有 n 种水果，每种水果选购的个数在 [ai, bi] 之间，
// 问买 m 个水果有多少种购买方案
// 测试链接 ：https://acm.hdu.edu.cn/showproblem.php?pid=2152
// 相关帖子 ：https://www.cnblogs.com/dx123/p/16882142.html
// 相关帖子 ：https://oi-wiki.org/math/poly/ogf/
// 提交以下的code，可以直接通过

#include <bits/stdc++.h>

using namespace std;

int n, m;
int a[110], b[110]; // 存幂次
int C[110], D[210]; // 存系数

int compute()
{
    // 清空系数数组
    for(int i = 0; i <= m; ++i) C[i] = D[i] = 0;
    // 填充第 1 项的系数
    for(int i = a[1]; i <= b[1]; ++i) C[i] = 1;
    // 从第 2 项开始枚举每一项
    for(int i = 2; i <= n; ++i)
    {
        // 计算 x^(j+k) 的系数
        for(int j = 0; j <= m; ++j) // 前面已经合并的选购 j 个水果
        {
            // 第 i 种水果选购 k 个
            for(int k = a[i]; k <= b[i]; ++k)
            {
                D[j + k] += C[j];
            }
        }
        // 转存 C，清空 D
        for(int j = 0; j <= m; ++j)
        {
            C[j] = D[j];
            D[j] = 0;
        }
    }
    return C[m];
}

int main()
{
    while(~scanf("%d%d", &n, &m))
    {
        for(int i = 1; i <= n; ++i)
        {
            scanf("%d%d", &a[i], &b[i]);
        }
        printf("%d\n", compute());
    }

    return 0;
}